package task3;

import java.io.*;

/**
 * 线程实现类
 */
public class ThreadPoolCopy implements Runnable{

    // 定义源复制的目录
    String from_pathname = "./src/task3/from_test";
    // 定义目的复制的目录
    String to_pathname = "./src/task3/to_test";

    @Override
    public void run() {
        copy(from_pathname,to_pathname);
    }

    private void copy(String from_pathname, String to_pathname) {
        // 生成File对象
        File from_file = new File(from_pathname);
        File to_file = new File(to_pathname);

        // 判断该路径是否存在
        if (from_file.exists()){
            // 判断当前File对象是否是文件
            if (from_file.isFile()){
                // 若是文件，则复制即可
                System.out.println("文件 " + from_file.getName() + " 已复制！");
                // 文件读取流定义
                FileInputStream fileInputStream = null;
                BufferedInputStream bufferedInputStream = null;
                // 文件写入流定义
                FileOutputStream fileOutputStream = null;
                BufferedOutputStream bufferedOutputStream = null;
                try {
                    // 先创建源路径同名空文件
                    if (!to_file.exists()){
                        to_file.getParentFile().mkdirs();
                        to_file.createNewFile();
                    }
                    // 文件读取流创建
                    fileInputStream = new FileInputStream(from_file);
                    bufferedInputStream = new BufferedInputStream(fileInputStream);
                    // 文件写入流创建
                    fileOutputStream = new FileOutputStream(to_file);
                    bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
                    // 定义缓冲区大小
                    byte[] bytes = new byte[1024];
                    // 定义返回结果值
                    int res = 0;
                    // 开始读取文件
                    while ((res = bufferedInputStream.read(bytes)) != -1){
                        // 读到缓冲区再写入
                        bufferedOutputStream.write(bytes,0,bytes.length);
                    }
                }  catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    // 关闭所有的流
                    if (bufferedOutputStream != null){
                        try {
                            bufferedOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fileOutputStream != null){
                        try {
                            fileOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (bufferedInputStream != null){
                        try {
                            bufferedInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fileInputStream != null){
                        try {
                            fileInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            // 如果是文件夹
            else {
                // 先获取该文件夹下的所有文件名
                String[] strings = from_file.list();
                for (String s:strings) {
                    // 对当前文件下的该文件拼接路径，递归调用复制方法
                    copy(from_pathname + "/" + s,to_pathname + "/" + s);
                }
                // 对当前目录进行复制
                System.out.println("目录 " + from_file.getName() + " 已复制！");
                // 创建目录
                to_file.mkdir();
            }
        }else
            System.out.println("源复制路径不存在！");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadPoolCopy());
        thread.start();
    }
}
